package JavaSE.ReflectLearning.Properties;

import java.io.FileInputStream;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Properties;

/**
 *  学习 通过传入config配置文件路径 获取指定类中的指定方法 并运行
 */
public class Demo {
    public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InstantiationException, IOException, InvocationTargetException, ClassNotFoundException {
        callTargetMethod("src\\JavaSE.ReflectLearning\\Properties\\config.properties");
    }

    public static void callTargetMethod(String configFilePath) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, IOException {
    // 创建Properties对象
    Properties properties = new Properties();
    // 创建输入流，指向配置文件路径
    FileInputStream fis = new FileInputStream(configFilePath);
    // properties对象加载输入流读取属性列表
    properties.load(fis);
    // 读取属性列表中的指定类名
    String className = properties.getProperty("className");
    // 读取属性列表中的指定方法名
    String methodName = properties.getProperty("methodName");
    // 用指定类名创建Class对象 进行反射
    Class targetClass = Class.forName(className);
    // 反射类的构造方法
    Constructor declaredConstructor = targetClass.getDeclaredConstructor(int.class, String.class);
    // 将访问权限改为true
    declaredConstructor.setAccessible(true);
    // 用构造方法创建对象
    Object o = declaredConstructor.newInstance(18, "张三");
    // 反射类的指定方法
    Method declaredMethod = targetClass.getDeclaredMethod(methodName, String.class, int.class);
    // 将访问权限改为true
    declaredMethod.setAccessible(true);
    // 用创建的对象执行方法
    declaredMethod.invoke(o, "红烧狮子头", 5);
}
}
